home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / bjtwin.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  4KB  |  190 lines

  1. #include "driver.h"
  2.  
  3. unsigned char *bjtwin_cmdram;
  4. unsigned char *bjtwin_workram;
  5. unsigned char *bjtwin_spriteram;
  6. unsigned char *bjtwin_txvideoram;
  7. unsigned char *bjtwin_videocontrol;
  8. size_t bjtwin_txvideoram_size;
  9.  
  10. static unsigned char * dirtybuffer;
  11. static struct osd_bitmap *tmpbitmap;
  12. static int flipscreen = 0;
  13.  
  14.  
  15. int bjtwin_vh_start(void)
  16. {
  17.     dirtybuffer = malloc(bjtwin_txvideoram_size/2);
  18.     tmpbitmap = osd_new_bitmap(Machine->drv->screen_width,Machine->drv->screen_height,Machine->scrbitmap->depth);
  19.  
  20.     if (!dirtybuffer || !tmpbitmap)
  21.     {
  22.         if (tmpbitmap) osd_free_bitmap(tmpbitmap);
  23.         if (dirtybuffer) free(dirtybuffer);
  24.         return 1;
  25.     }
  26.  
  27.     bjtwin_spriteram = bjtwin_workram + 0x8000;
  28.  
  29.     return 0;
  30. }
  31.  
  32. void bjtwin_vh_stop(void)
  33. {
  34.     osd_free_bitmap(tmpbitmap);
  35.     free(dirtybuffer);
  36.  
  37.     dirtybuffer = 0;
  38.     tmpbitmap = 0;
  39. }
  40.  
  41.  
  42. READ_HANDLER( bjtwin_txvideoram_r )
  43. {
  44.     return READ_WORD(&bjtwin_txvideoram[offset]);
  45. }
  46.  
  47. WRITE_HANDLER( bjtwin_txvideoram_w )
  48. {
  49.     int oldword = READ_WORD(&bjtwin_txvideoram[offset]);
  50.     int newword = COMBINE_WORD(oldword,data);
  51.  
  52.     if (oldword != newword)
  53.     {
  54.         WRITE_WORD(&bjtwin_txvideoram[offset],newword);
  55.         dirtybuffer[offset/2] = 1;
  56.     }
  57. }
  58.  
  59.  
  60. WRITE_HANDLER( bjtwin_paletteram_w )
  61. {
  62.     int r,g,b;
  63.     int oldword = READ_WORD(&paletteram[offset]);
  64.     int newword = COMBINE_WORD(oldword,data);
  65.  
  66.  
  67.     WRITE_WORD(&paletteram[offset],newword);
  68.  
  69.     r = ((newword >> 11) & 0x1e) | ((newword >> 3) & 0x01);
  70.     g = ((newword >>  7) & 0x1e) | ((newword >> 2) & 0x01);
  71.     b = ((newword >>  3) & 0x1e) | ((newword >> 1) & 0x01);
  72.  
  73.     r = (r << 3) | (r >> 2);
  74.     g = (g << 3) | (g >> 2);
  75.     b = (b << 3) | (b >> 2);
  76.  
  77.     palette_change_color(offset / 2,r,g,b);
  78. }
  79.  
  80.  
  81. WRITE_HANDLER( bjtwin_flipscreen_w )
  82. {
  83.     if ((data & 1) != flipscreen)
  84.     {
  85.         flipscreen = data & 1;
  86.         memset(dirtybuffer, 1, bjtwin_txvideoram_size/2);
  87.     }
  88. }
  89.  
  90. void bjtwin_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  91. {
  92.     static int oldbgstart = -1;
  93.     int offs, bgstart;
  94.  
  95.     bgstart = 2048 * (READ_WORD(&bjtwin_videocontrol[0]) & 0x0f);
  96.  
  97.     palette_init_used_colors();
  98.  
  99.     for (offs = (bjtwin_txvideoram_size/2)-1; offs >= 0; offs--)
  100.     {
  101.         int color = (READ_WORD(&bjtwin_txvideoram[offs*2]) >> 12);
  102.         memset(&palette_used_colors[16 * color],PALETTE_COLOR_USED,16);
  103.     }
  104.  
  105.     for (offs = 0; offs < 256*16; offs += 16)
  106.     {
  107.         if (READ_WORD(&bjtwin_spriteram[offs]) != 0)
  108.             memset(&palette_used_colors[256 + 16*READ_WORD(&bjtwin_spriteram[offs+14])],PALETTE_COLOR_USED,16);
  109.     }
  110.  
  111.     if (palette_recalc() || (oldbgstart != bgstart))
  112.     {
  113.         oldbgstart = bgstart;
  114.         memset(dirtybuffer, 1, bjtwin_txvideoram_size/2);
  115.     }
  116.  
  117.     for (offs = (bjtwin_txvideoram_size/2)-1; offs >= 0; offs--)
  118.     {
  119.         if (dirtybuffer[offs])
  120.         {
  121.             int sx = offs / 32;
  122.             int sy = offs % 32;
  123.  
  124.             int tilecode = READ_WORD(&bjtwin_txvideoram[offs*2]);
  125.             int bank = (tilecode & 0x800) ? 1 : 0;
  126.  
  127.             if (flipscreen)
  128.             {
  129.                 sx = 47-sx;
  130.                 sy = 31-sy;
  131.             }
  132.  
  133.             drawgfx(tmpbitmap,Machine->gfx[bank],
  134.                     (tilecode & 0x7ff) + ((bank) ? bgstart : 0),
  135.                     tilecode >> 12,
  136.                     flipscreen, flipscreen,
  137.                     8*sx,8*sy,
  138.                     0,TRANSPARENCY_NONE,0);
  139.  
  140.             dirtybuffer[offs] = 0;
  141.         }
  142.     }
  143.  
  144.     /* copy the character mapped graphics */
  145.     copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  146.  
  147.     for (offs = 0; offs < 256*16; offs += 16)
  148.     {
  149.         if (READ_WORD(&bjtwin_spriteram[offs]) != 0)
  150.         {
  151.             int sx = (READ_WORD(&bjtwin_spriteram[offs+8]) & 0x1ff) + 64;
  152.             int sy = (READ_WORD(&bjtwin_spriteram[offs+12]) & 0x1ff);
  153.             int tilecode = READ_WORD(&bjtwin_spriteram[offs+6]);
  154.             int xx = (READ_WORD(&bjtwin_spriteram[offs+2]) & 0x0f) + 1;
  155.             int yy = (READ_WORD(&bjtwin_spriteram[offs+2]) >> 4) + 1;
  156.             int width = xx;
  157.             int delta = 16;
  158.             int startx = sx;
  159.  
  160.             if (flipscreen)
  161.             {
  162.                 sx = 367 - sx;
  163.                 sy = 239 - sy;
  164.                 delta = -16;
  165.                 startx = sx;
  166.             }
  167.  
  168.             do
  169.             {
  170.                 do
  171.                 {
  172.                     drawgfx(bitmap,Machine->gfx[2],
  173.                             tilecode & 0x1fff,
  174.                             READ_WORD(&bjtwin_spriteram[offs+14]),
  175.                             flipscreen, flipscreen,
  176.                             sx & 0x1ff,sy & 0x1ff,
  177.                             &Machine->drv->visible_area,TRANSPARENCY_PEN,15);
  178.  
  179.                     tilecode++;
  180.                     sx += delta;
  181.                 } while (--xx);
  182.  
  183.                 sy += delta;
  184.                 sx = startx;
  185.                 xx = width;
  186.             } while (--yy);
  187.         }
  188.     }
  189. }
  190.